from flask import render_template,current_app,session,jsonify,request,g
from . import news_blue
from info.models import User,News,Category
# 导入常量信息
from info import constants,db
from info.utils.response_code import RET
# 导入自定义用户登陆装饰器
from info.utils.common import user_login_data


@news_blue.route('/')
@user_login_data
def index():
    # 获取session中的用户id
    # user_id = session.get('user_id')
    # user = None
    # 点击排行新闻列表
    news_list = None
    categorys = None
    # 获取用户信息
    # if user_id:
    #     try:
    #         user=User.query.get(user_id)
    #     except Exception as e:
    #         current_app.logger.error(e)
    # 获取点击排行新闻列表
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)

    # 判断查询结果
    if not news_list:
        return jsonify(errno=RET.DATAERR, errmsg='没有新闻信息')

    # 定义容器，存储新闻数据
    news_click_list = []
    for news in news_list:
        news_click_list.append(news.to_dict())

    # 获取新闻分类信息
    try:
        categorys = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
    # 判断查询结果
    if not categorys:
        return jsonify(errno=RET.DATAERR, errmsg='没有分类信息')

    category_list=[]
    for category in categorys:
        category_list.append(category.to_dict())
        print(category)
    data={
        'user_info':g.user.to_dict() if g.user else None,
        'click_news_list':news_click_list,
        'category_list':category_list
    }


    return render_template('news/index.html',data=data)

# 根据首页新闻列表,展示新闻
@news_blue.route("/news_list")
def news_list():
    # 获取参数
    cid=request.args.get('cid','1')
    page=request.args.get('page',1)
    per_page=request.args.get('per_page','10')
    # 类型转换
    try:
        cid,page,per_page=int(cid),int(page),int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数类型错误')
    # 根据类型获取数据
    # 这里因为我们类型一为查询所有,其他类型为根据分类查询
    # 我们这里用到解包的知识,可以解决写一条语句完成2项代码
    filters=[]
    if cid>1:
        filters.append(News.category_id==cid)
    try:
        paginate=News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page,per_page,False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询新闻列表数据失败')
    news_list = paginate.items
    total_page=paginate.pages
    current_page=paginate.page
    news_dict_list=[]
    for news in news_list:
        news_dict_list.append(news.to_dict())
    data = {
        'total_page': total_page,
        'current_page': current_page,
        'news_dict_list': news_dict_list
    }
    # print(data['news_dict_list'])
    # 返回数据
    return jsonify(error=RET.OK, errmsg='OK', data=data)
# 新闻详情
@news_blue.route('/<int:news_id>')
@user_login_data
def news_detail(news_id):
    user=g.user
    # 新闻点击排行
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询新闻排行数据失败')
    # 判断查询结果
    if not news_list:
        return jsonify(errno=RET.NODATA, errmsg='无新闻排行数据')

    # 定义容器，存储新闻数据
    news_click_list = []
    for news in news_list:
        news_click_list.append(news.to_dict())
        # print(news)
    # 查询指定新闻
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询新闻详情数据失败')
    if not news:
        return jsonify(errno=RET.NODATA, errmsg='无新闻数据')
    news.clicks+=1
    try:
        db.session.add(news)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存数据失败')
    # 定义标记，用来标识用户是否收藏
    is_collected = False
    # 判断用户是否登录，以及用户是否收藏该新闻
    if g.user and news in user.collection_news:
        is_collected = True
    data={
        'news_detail': news.to_dict(),
        'user_info': user.to_dict() if user else None,
        'click_news_list': news_click_list,
        'is_collected': is_collected,
    }
    return render_template('news/detail.html', data=data)
# 加载logo图标：浏览器会默认请求url地址：http://127.0.0.1:5000/favicon.ico
# favicon文件的路径：http://127.0.0.1:5000/static/news/favicon.ico
# 原因:
# 1、浏览器不是每次都请求，会使用缓存。
# 2、清空浏览器缓存。
# 3、浏览器需要彻底退出，重新启动。
@news_blue.route('/favicon.ico')
def favicon():
    # 把favicon图标传给浏览器,发送静态文件给浏览器
    return current_app.send_static_file('news/favicon.ico')